package cn.jinzhu.netty.c1;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import lombok.extern.slf4j.Slf4j;



public class HelloServer {

    public static void main(String[] args) {
    NioEventLoopGroup group = new NioEventLoopGroup();
        // 服务器端的启动器 netty启动器 组装netty组件
        new ServerBootstrap()
                // EventLoop 创建 NioEventLoopGroup，可以简单理解为 `线程池 + Selector`
                // EventLoop表示  一个selector加一个线程就表示一个eventloop
                //事件循环监听
                //NioEventLoopGroup 表示一个eventloop 组
                .group(new NioEventLoopGroup())
               //一个服务端的Channel的实现
                //选择服务 Scoket 实现类，其中 NioServerSocketChannel 表示基于 NIO 的服务器端实现
                .channel(NioServerSocketChannel.class)
                 //表示socketChannel建立连接后能做哪些事 也就是业务处理  （负责处理读写操作）
                .childHandler(
                        //Channel代表建立连接后和客户端进行读写的通道Initializer表示初始化器（对handler进行初始化）负责添加别的handler
                        new ChannelInitializer<NioSocketChannel>() {
                    // 初始化handler并且添加handler
                    @Override
                    protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
                        //  添加解码的handler  将传输过来的buff转换成字符串StringDecoder
                        nioSocketChannel.pipeline().addLast(new StringDecoder());
                        //  添加自定义handler 这里表示在读事件发生后进行读操作
                        nioSocketChannel.pipeline().addLast("sdadsa",new SimpleChannelInboundHandler<String>() {
                            //打印解码的handler 转换好的buff
                            @Override
                            protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
                                System.out.println("发送过来的数据是"+s);
                                //丢给下面线程处理
                                channelHandlerContext.fireChannelRead(s);
                            }

                        });
                         //线程切换group
                        nioSocketChannel.pipeline().addLast(group,"sdadsa1",new SimpleChannelInboundHandler<String>() {
                            //打印解码的handler 转换好的buff
                            @Override
                            protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
                                System.out.println("发送过来的数据是"+s);
                            }

                        });
                    }
                    //绑定端口
                }).bind(8080);
    }
}